package com.insight.repository;

import com.insight.common.enums.ExportFormat;
import com.insight.common.enums.ExportStatus;
import com.insight.entity.DictionaryExport;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

/**
 * T081: DictionaryExport Repository
 * 数据字典导出记录的数据访问层
 *
 * @author Insight Team
 */
@Repository
public interface DictionaryExportRepository extends JpaRepository<DictionaryExport, Long> {

    /**
     * 根据数据源ID查询导出记录
     *
     * @param datasourceId 数据源ID
     * @return 导出记录列表
     */
    List<DictionaryExport> findByDataSourceId(Long datasourceId);

    /**
     * 根据数据源ID和导出格式查询记录
     *
     * @param datasourceId 数据源ID
     * @param format       导出格式
     * @return 导出记录列表
     */
    List<DictionaryExport> findByDataSourceIdAndFormat(Long datasourceId, ExportFormat format);

    /**
     * 根据状态查询导出记录
     *
     * @param status 导出状态
     * @return 导出记录列表
     */
    List<DictionaryExport> findByStatus(ExportStatus status);

    /**
     * 根据是否归档查询记录
     *
     * @param isArchived 是否已归档
     * @return 导出记录列表
     */
    List<DictionaryExport> findByIsArchived(Boolean isArchived);

    /**
     * 查询指定时间之前创建的记录（用于清理过期文件）
     *
     * @param createdBefore 创建时间上限
     * @return 导出记录列表
     */
    List<DictionaryExport> findByCreatedAtBefore(LocalDateTime createdBefore);

    /**
     * 查询已过期的导出记录
     * 过期时间不为null且已过当前时间
     *
     * @param now 当前时间
     * @return 过期的导出记录列表
     */
    @Query("SELECT e FROM DictionaryExport e WHERE e.expiresAt IS NOT NULL AND e.expiresAt < :now")
    List<DictionaryExport> findExpiredExports(@Param("now") LocalDateTime now);

    /**
     * 查询数据源的最新导出记录
     *
     * @param datasourceId 数据源ID
     * @return 最新的导出记录
     */
    Optional<DictionaryExport> findFirstByDataSourceIdOrderByCreatedAtDesc(Long datasourceId);

    /**
     * 查询数据源指定格式的最新导出记录
     *
     * @param datasourceId 数据源ID
     * @param format       导出格式
     * @return 最新的导出记录
     */
    Optional<DictionaryExport> findFirstByDataSourceIdAndFormatOrderByCreatedAtDesc(
            Long datasourceId, ExportFormat format);

    /**
     * 查询待归档的导出记录
     * 状态为SUCCESS且未归档
     *
     * @return 待归档的导出记录列表
     */
    @Query("SELECT e FROM DictionaryExport e WHERE e.status = 'SUCCESS' AND e.isArchived = false")
    List<DictionaryExport> findPendingArchiveExports();

    /**
     * 统计数据源的导出记录数量
     *
     * @param datasourceId 数据源ID
     * @return 记录数量
     */
    long countByDataSourceId(Long datasourceId);

    /**
     * 统计指定状态的导出记录数量
     *
     * @param status 导出状态
     * @return 记录数量
     */
    long countByStatus(ExportStatus status);

    /**
     * 删除数据源的所有导出记录
     *
     * @param datasourceId 数据源ID
     */
    void deleteByDataSourceId(Long datasourceId);

    /**
     * 删除指定时间之前创建的记录
     *
     * @param createdBefore 创建时间上限
     */
    void deleteByCreatedAtBefore(LocalDateTime createdBefore);
}
